/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Problemas;

import Busquedas.Estado;

/**
Version del problema del viajante con las Capitales de Andalucía
La provincia que tenga un uno significa que estamos en ella
 */
public class Viajante extends Problema  {

    private int huelva;
    private int sevilla;
    private int cadiz;
    private int malaga;
    private int cordoba;
    private int jaen;
    private int granada;
    private int almeria;

    public Viajante(){

        int[] paramInicial=   {1,0,0,0,0,0,0,0};
		int[] paramObjetivo = {0,0,0,0,0,0,0,1};
		Estado inicial = new Estado(paramInicial);
		Estado [] objetivo = new Estado[1];
		objetivo[0] = new Estado(paramObjetivo);
		String [] nombresOperadores={"padre","IrHuSe","IrHuCa","IrSeCA","IrSeMa",
        "IrSeCor","IrCaMa","IrMaGr","IrMaCor","IrCorJa","IrCorGr","IrJaGr",
        "IrJaAlm","IrGrAlm"};
		int [] costeOperadores={94,219,125,219,138,265,129,187,104,236,99,228,166};
		inicializa(inicial,objetivo,13,nombresOperadores,costeOperadores);

    }

     public void asignaParametros(Estado actual){
		huelva = actual.getParametro(0);
		sevilla = actual.getParametro(1);
		cadiz = actual.getParametro(2);
                malaga= actual.getParametro(3);
		cordoba = actual.getParametro(4);
		jaen = actual.getParametro(5);
                granada = actual.getParametro(6);
		almeria = actual.getParametro(7);
	}
    public Estado IrHuSe(Estado actual){ 
        if (actual.getParametro(0)==1){
                        System.out.println("Huse");
			int param[] = {0,1,actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
                        
        }
        else{
            if (actual.getParametro(1)==1){
                System.out.println("SeHu"); 
                int param[] = {1,0,actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
           
            else
                return null;
            
        }
	}
        public Estado IrHuCa(Estado actual){
            
        if (actual.getParametro(0)==1){
                        System.out.println("Huca");
			int param[] = {0,actual.getParametro(1),1,actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(2)==1){
                System.out.println("Cahu");
                int param[] = {1,actual.getParametro(1),0,actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}    public Estado IrSeCA(Estado actual){
        if (actual.getParametro(1)==1){
                        System.out.println("Seca");
			int param[] = {actual.getParametro(0),0,1,actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(2)==1){
                System.out.println("CaSe");
                int param[] = {actual.getParametro(0),1,0,actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}    public Estado IrSeMa(Estado actual){
        if (actual.getParametro(1)==1){
                         System.out.println("sema");
			int param[] = {actual.getParametro(0),0,actual.getParametro(2),1,actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(3)==1){
                System.out.println("Mase");
                int param[] = {actual.getParametro(0),1,actual.getParametro(2),0,actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrSeCor(Estado actual){
        if (actual.getParametro(1)==1){
                        System.out.println("secor");
			int param[] = {actual.getParametro(0),0,actual.getParametro(2),actual.getParametro(3),1,actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(4)==1){
                 System.out.println("Corse");
                int param[] = {actual.getParametro(0),1,actual.getParametro(2),actual.getParametro(3),0,actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrCaMa(Estado actual){
        if (actual.getParametro(2)==1){
                        System.out.println("cama");
			int param[] = {actual.getParametro(0),actual.getParametro(1),0,1,actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(3)==1){
                 System.out.println("mACA");
                int param[] = {actual.getParametro(0),actual.getParametro(1),1,0,actual.getParametro(4),actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrMaGr(Estado actual){       
        if (actual.getParametro(3)==1){
                        System.out.println("magr");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),0,actual.getParametro(4),actual.getParametro(5),1,actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(6)==1){
                System.out.println("GRMA");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),1,actual.getParametro(4),actual.getParametro(5),0,actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrMaCor(Estado actual){
        if (actual.getParametro(3)==1){
                        System.out.println("macor");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),0,1,actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(4)==1){
                System.out.println("corMA");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),1,0,actual.getParametro(5),actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrCorJa(Estado actual){
        if (actual.getParametro(4)==1){
                        System.out.println("CorJa");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),0,1,actual.getParametro(6),actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(5)==1){
                System.out.println("JaCor");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),1,0,actual.getParametro(6),actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}    public Estado IrCorGr(Estado actual){
        if (actual.getParametro(4)==1){
                        System.out.println("cogr");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),0,actual.getParametro(5),1,actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(6)==1){
                System.out.println("grcor");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),1,actual.getParametro(5),0,actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrJaGr(Estado actual){

        if (actual.getParametro(5)==1){
                        System.out.println("Jagr");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),0,1,actual.getParametro(7)};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(6)==1){
                System.out.println("grja");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),1,0,actual.getParametro(7)};
                return new Estado(param);
            }
            else
                return null;
        }
	}    public Estado IrJaAlm(Estado actual){

        if (actual.getParametro(5)==1){
                        System.out.println("JaALm");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),0,actual.getParametro(6),1};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(7)==1){
                System.out.println("almJa");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),1,actual.getParametro(6),0};
                return new Estado(param);
            }
            else
                return null;
        }
	}
    public Estado IrGrAlm(Estado actual){
        if (actual.getParametro(6)==1){
                        System.out.println("Gralm");
			int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),0,1};
			return new Estado(param);
        }
        else{
            if (actual.getParametro(7)==1){
                System.out.println("almgr");
                int param[] = {actual.getParametro(0),actual.getParametro(1),actual.getParametro(2),actual.getParametro(3),actual.getParametro(4),actual.getParametro(5),1,0};
                return new Estado(param);
            }
            else
                return null;
        }
	}

    	public Estado aplicaOperador(Estado actual,int i){
            asignaParametros(actual);
            Estado siguiente = null;
		switch(i){
		case 0:
			siguiente = IrHuSe(actual);
			break;
		case 1:
			siguiente = IrHuCa(actual);
			break;
		case 2:
			siguiente = IrSeCA(actual);
			break;
		case 3:
			siguiente = IrSeMa(actual);
			break;
                case 4:
			siguiente = IrSeCor(actual);
			break;
		case 5:
			siguiente = IrCaMa(actual);
			break;
		case 6:
			siguiente = IrMaGr(actual);
			break;
		case 7:
			siguiente = IrMaCor(actual);
			break;
                case 8:
			siguiente = IrCorJa(actual);
			break;
		case 9:
			siguiente = IrCorGr(actual);
			break;
		case 10:
			siguiente = IrJaGr(actual);
			break;
		case 11:
			siguiente = IrJaAlm(actual);
			break;
                case 12:
			siguiente = IrGrAlm(actual);
			break;        
		}
		return siguiente;
	}
	public int getOperadorInverso(int op){
		return op;
	}
    //Distancia en linea recta
    public int funcionHeuristica(Estado e){
		int param[] = e.getParametros();
		int distancia=0;
            if (param[0]==1)
                distancia = 516;//Hu
            if (param[1]==1)
                distancia = 422;//Sev
            if (param[2]==1)
                distancia = 484;//Ca
            if (param[3]==1)
                distancia = 219; //Ma
            if (param[4]==1)
                distancia = 332; //Cord
            if (param[5]==1)
                distancia = 228;//Ja
            if (param[6]==1)
                distancia = 166;//Gr
            if (param[7]==1)
                distancia = 0;  //Alm
		return distancia;   
	}

}
